package github.ziwukun.jsonql.lang;

import java.util.LinkedList;
import java.util.List;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

class SortJson {
	
	/**
	 * 从JSON对象中创建JsonQLSort，JSON对象形如：<br>
	 * {"name":"@desc","age":"@asc","article":{"name":"@desc"}}
	 * 
	 * @param json
	 * @return
	 */
	static SortImpl readJson(String json) {
		if (!JSONUtil.isJsonObj(json)) {
			throw new JsonQLFormatException("参数不是一个JSON对象-" + json,
				"@sort语句语法错误-" + json);
		}
		
		// 把对象转换成排序列表
		JSONObject sortJson = new JSONObject(json,false,true);
		// 结果对象
		
		List<PropSort> propSorts = new LinkedList<>();
		for (String name : sortJson.keySet()) {
			Object value = sortJson.get(name);
			// value == null 语法错误
			if(value == null) {
				throw new JsonQLFormatException(
					"JsonQLSort解析错误，name="+name+"的值不能null",
					"@sort语句语法错误-" + json);
			}
			
			// 如果值是字符串，就是可以直接转换成对象
			if(value instanceof String && SortSym.isSortSym(value.toString())) {
				PropSortImpl sortItem = new PropSortImpl(
					name, SortSym.valOf(value.toString()));
				propSorts.add(sortItem);
			}
			// 如果值是JSON对象，表示要递归
			else if(value instanceof JSONObject) {
				SortImpl subSort = SortJson.readJson(value.toString());
				PropSortImpl sortItem = new PropSortImpl(name,subSort);
				propSorts.add(sortItem);
			}
			else {
				// 其他情况 解析错误
				throw new JsonQLFormatException(
					"JsonQLSort解析错误，name="+name+"的值类型错误",
					"@sort解析错误-" + json);
			}
		}
		
		return new SortImpl(propSorts);
	}
	
	static String writeJson(SortImpl sort) {
		JSONObject json = new JSONObject(true);
		for (PropSort propSort : sort.propSorts) {
			JSONObject itemJson = new JSONObject(propSort.toJSONQL());
			String itemKey = itemJson.keySet().iterator().next();
			Object itemValue = itemJson.get(itemKey);
			json.set(itemKey, itemValue);
		}
		return json.toString();
	}
}
